package day1902;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.Arrays;

public class fanshe {
    public static void main(String[] args) throws Exception {
        //com();
        //com2();//反射构造方法
        //com3();//反射成员变量
        com4();//反射成员方法
        //com5();//反射创建对象
        //com6();//暴力反射

    }

    private static void com6() {

    }

    private static void com5() throws Exception {
        Class dx = sddt.class;
        //创建无参对象
        sddt s = (sddt) dx.newInstance();//调用无参构造，创造对象，无参方法构造没有的时候，会报错
        Object ss = dx.newInstance();
        System.out.println(s.toString());
        //触发指定的方法创造对象
        Constructor c =dx.getConstructor(int.class,int.class,double.class);//触发指定参数的构造方法//c就是想要出发的构造方法
        Object ob=c.newInstance(5,10,5.5);//ob为触发含参构造的对象
        System.out.println(ob);
    }

    private static void com4() throws Exception {
        Class cyff = new sddt().getClass();//获取class实例
 //       Method[] ms=cyff.getMethods();//获取的方法包括父类的参数
//        for(Method mn:ms){//遍历数组
//            System.out.println(mn.getName());//输出方法名称
//            Class[] fs = mn.getParameterTypes();//获取方法参数liebiao
//            System.out.println(Arrays.toString(fs));//输出参数数组
//        }
        Method ms=cyff.getMethod("aaa", int.class,int.class);
        Object ob = cyff.newInstance();
        ms.invoke(ob,10,20);
    }

    private static void com3() throws Exception {
        Class cybl = sddt.class;//获取class文件
//        Field[] fb = cybl.getFields();//获取成员变量数组
//        for(Field xx : fb){//遍历
//            System.out.println(xx.getName());//获取变量名
//            System.out.println(xx.getType().getName());//获取变量类型
//       }
        Object ob = cybl.newInstance();
        Field f = cybl.getDeclaredField("a");
        f.set(ob,100);
        System.out.println(f.get(ob));
    }

    private static void com2() {
        Class abcd = sddt.class;//1,获取class对象，class首字母大写

        Constructor[] ag= abcd.getConstructors();//2：获取所有构造方法，构建成con数组
        for(Constructor bl:ag){//3，遍历数组
            System.out.println(bl.getName());//4：获取构造方法名称
            Class[] cs = bl.getParameterTypes();//5：获取构造方法参数
            System.out.println(Arrays.toString(cs));
        }
    }

    private static void com() throws Exception {
        Class a =Class.forName("day1902.sddt");//类名对象，包名.类名
        System.out.println(a);
        Class b = sddt.class;
        System.out.println(b);
//        sddt  d = new sddt();
//        Class c = a.getClass();
        Class c = new sddt().getClass();
        System.out.println(c);

        //获取包名
        System.out.println(c.getPackage().getName());//获取包名
        System.out.println(c.getName());//获取完整类名
        System.out.println(c.getSimpleName());//获取类名

        Field[] xx= c.getDeclaredFields();//返回类的变量数组
        for(Field w:xx){
            System.out.println(w);
        }

        Member[] yy =c.getDeclaredMethods();//返回类的普通方法
        for(Member w:yy){
            System.out.println(w);
        }

        Member[] zz=c.getConstructors();//返回类的构造方法
        for(Member s:zz){
            System.out.println(s);
        }
        c.newInstance();//创建类的实例
    }
}
